/*
 * gui.h
 *
 *  Created on: 2023年9月10日
 *      Author: Cheney.Tan
 */

#ifndef GUI_H_
#define GUI_H_

#include "stdint.h"

#ifdef __cplusplus
extern "C"
{
#endif

#ifndef NULL
#define NULL 0
#endif

typedef struct _gui_obj
{
	struct _gui_obj *parent; /* 上一级控件 */
	struct _gui_obj *child; /* 下一级控件 */
	struct _gui_obj *prev; /* 上一个控件 */
	struct _gui_obj *next; /* 下一个控件 */

	struct
	{
		uint32_t is_changed :1; /* 是否需要重新刷新 */
		uint32_t is_selected :1; /* 是否已选中 */
		uint32_t selectable :1; /* 是否可选中 */
		uint32_t event_type :3; /* 事件类型，不同控件类型定义不同 */
	} status;

//	uint16_t x, y, w, h;

	void (*event_cb)(uint8_t event); /* 事件回调 */

	void (*draw)(struct _gui_obj *obj); /* 绘制控件 */
} t_gui_obj;

typedef void (t_func_gui_event_cb)(uint8_t event);
typedef void (t_func_gui_draw)(t_gui_obj *obj);

typedef struct _gui_page
{
	struct _gui_page *parent;

	const char *title;
	t_gui_obj *item_list_head;
	t_gui_obj *item_current; /* 总是指向当前选中的控件 */

	void (*enter)(void);
	void (*exit)(void);

} t_gui_page;

typedef struct
{
	t_gui_obj base;
	const char *text;
	uint16_t x, y, w, h;
	uint8_t font_size;

} t_gui_button;

typedef struct
{
	t_gui_obj base;
	const char *text;
	uint16_t x, y, w, h;
	uint8_t font_size;
} t_gui_label;

typedef struct
{
	t_gui_obj base;
	const char *img;
	uint16_t x, y, w, h;
} t_gui_image;

typedef struct
{
	t_gui_obj base;
	const char *img;
	const char *text;
	uint16_t x, y, w, h;
	uint8_t font_size;
} t_gui_image_button;

/**
 * GUI common API
 */
int32_t gui_init(void);
void gui_refresh(void);
void gui_polling(uint16_t interval_in_ms);
void gui_event_handler(void);

void gui_obj_set_event_cb(t_gui_obj *obj, t_func_gui_event_cb cb);
void gui_obj_delete(t_gui_obj *obj);

/**
 * GUI page API
 */
t_gui_page* gui_page_create(const char *title);
void gui_page_dispose(t_gui_page *page);
void gui_page_set_cb(t_gui_page *page, void (*enter)(void), void (*exit)(void));
void gui_page_change_to(t_gui_page *page);
void gui_page_obj_add(t_gui_page *page, t_gui_obj *obj);
void gui_page_obj_next(t_gui_page *page);
void gui_page_obj_prev(t_gui_page *page);

t_gui_obj* gui_button_create(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
		const char *text, uint8_t font_size);
void gui_button_set_text(t_gui_obj *button, const char *text);

t_gui_obj* gui_label_create(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
		const char *text, uint8_t font_size);
void gui_label_set_text(t_gui_obj *label, const char *text);

t_gui_obj* gui_image_create(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
		const char *img);
void gui_image_set_src(t_gui_obj *img, const char *img_src);

t_gui_obj* gui_image_button_create(uint16_t x, uint16_t y, uint16_t w,
		uint16_t h, const char *img, const char *text, uint8_t font_size);

#ifdef __cplusplus
}
#endif

#endif /* GUI_H_ */
